package com.tensquare.user.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tensquare.user.pojo.TbRole;
import com.tensquare.user.pojo.TbUser;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
public interface RoleDao extends BaseMapper<TbRole> {

    @Select("select * from tb_role where id in (select ur.role_id from tb_user_role ur where user_id = #{userId})")
    List<TbRole> selectRoleByUserId(@Param("userId") String userId);

    @Select("select * from tb_role where id in (select ur.role_id from tb_user_role ur where account = #{account})")
    List<TbRole> selectRoleByUserAccount(@Param("account") String account);

    /**
     * 按条件删除tb_role_permission表里的列
     *
     * @param roleId role_id
     */
    int deleteByRolePer(@Param("roleId") Integer roleId);

    /**
     * 按条件批量删除tb_role_permission表里的列
     *
     * @param roleIds role_id的集合
     */
    int deleteByRolePers(@Param("roleIds") ArrayList<Integer> roleIds);

    /**
     * 按条件批量删除tb_user_role表里的列
     *
     * @param roleIds role_id的集合
     */
    int deleteByUserRole(@Param("roleIds") ArrayList<Integer> roleIds);

    /**
     * 给角色添加权限
     *
     * @param roleId        角色Id
     * @param permissionIds 权限Id的集合
     */
    int addPermissionForRole(@Param("roleId") Integer roleId, @Param("permissionId") ArrayList<Integer> permissionIds);

    /**
     * 查询tb_role表的列名
     */
    @Select("select COLUMN_NAME from information_schema.COLUMNS where table_name=#{tableName} and table_schema=#{databaseName}")
    ArrayList<String> selectColumnName(@Param("tableName") String tableName, @Param("databaseName") String databaseName);

    /**
     * 按条件删除tb_user_role表的列
     *
     * @param userId 用户Id
     */
    @Delete("delete from tb_user_role where user_id=#{userId}")
    int delAllRoleToUser(@Param("userId") String userId);

    /**
     * 批量赋予用户角色
     *
     * @param roleIds 角色Id的集合
     * @param userId  用户Id
     */
    int addRolesToUser(@Param("roleIds") ArrayList<Integer> roleIds, @Param("userId") String userId);

    /**
     * 查询该角色拥有用户的数量
     *
     * @param roleId 角色Id
     */
//    @Select("select count(1) from tb_user_role where role_id=#{roleId}")
    int findUserCountByRoleId(@Param("roleId") Integer roleId,@Param("nickname") String nickname,@Param("mobile") String mobile);

    /**
     * 分页查询拥有该角色身份的用户信息
     *
     * @param roleId 角色Id
     */
//    @Select("select * from tb_user where id in (select user_id from tb_user_role where role_id=#{roleId}) limit #{pageNum},#{pageSize}")
    ArrayList<TbUser> findUserByRoleId(@Param("roleId") Integer roleId, @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize,@Param("nickname") String nickname,@Param("mobile") String mobile);

    /**
     * 删除用户的角色
     *
     * @param roleId  角色Id
     * @param userIds 用户Id的集合
     */
    int delUserRoleByUserIds(@Param("roleId") Integer roleId, @Param("userIds") ArrayList<String> userIds);

    /**
     * 分页查询不拥有该角色的用户数量
     *
     * @param roleId 角色Id
     */
    //这样会统计重复记录!!!
//    @Select("select count(1) from tb_user u left join tb_user_role ur on u.id=ur.user_id " +
//            "where ur.role_id!=#{roleId} or ur.id is null")
//    @Select("select count(1) from tb_user u WHERE not EXISTS(select 1 from tb_user_role ur where u.id=ur.user_id and ur.role_id=#{roleId})")
    int findUserCountNotInRole(@Param("roleId") Integer roleId,@Param("nickname") String nickname,@Param("mobile") String mobile);


    /**
     * 分页查询不拥有该角色的用户
     *
     * @param roleId 角色Id
     */
    //这样会统计重复记录!!!
//    @Select("select * from tb_user u left join tb_user_role ur on u.id=ur.user_id " +
//            "where ur.role_id!=#{roleId} or ur.id is null limit #{pageNum},#{pageSize}")
//    @Select("select * from tb_user u WHERE not EXISTS(select 1 from tb_user_role ur where u.id=ur.user_id and ur.role_id=#{roleId}) limit #{pageNum},#{pageSize}")
    ArrayList<TbUser> findUserNotInRole(@Param("roleId") Integer roleId, @Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize,@Param("nickname") String nickname,@Param("mobile") String mobile);

    /**
     * 批量赋予用户角色
     * @param roleId 角色id
     * @param userIds 用户Id集合
     */
    int addRoleToUsers(@Param("roleId") Integer roleId, @Param("userIds") ArrayList<String> userIds);
}
